package com.ys.day27.p1线程池;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * 描述:
 * 支持定时与周期性任务的线程池(newScheduledThreadPool)
 * @author CodeYang
 * @version 2021/1/6 16:23
 */
public class P4定时任务线程池 {



    public static void main(String[] args) {

        //method01();
        method02();



    }

    /**
     *scheduleWithFixedDelay
     *          * 以固定的延迟时间来调度定时任务
     *          * 任务执行间隔 = 周期(1000)+任务执行时间(800)
     *          *
     * 实际间隔时间: 是周期时间+线程执行时间
     */
    private static void method02() {

        ScheduledExecutorService ses = Executors.newScheduledThreadPool(10);
        ses.scheduleWithFixedDelay(new Runnable() {
            @Override
            public void run() {
                LocalDateTime ldt = LocalDateTime.now();
                DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-LL-dd HH:mm:ss:SS");
                String dateTime = dtf.format(ldt);
                System.out.println(dateTime);

                try {
                    Thread.sleep(800);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },1000,1000,TimeUnit.MICROSECONDS);
    }

    /**
     * scheduleWithFixedDelay 以固定的频率执行定时任务
     * 1如果 线程阻塞时间小于 参数3 线程的周期时间,线程按 参数3来间隔启动
     * 2如果 线程执行时间大于参数3 按 线程实际实际执行
     */
    private static void method01() {
        ScheduledExecutorService ses = Executors.newScheduledThreadPool(100);

        /**
         * scheduleWithFixedDelay
         * 执行间隔是多少?
         * 1如果 线程阻塞时间小于 参数3 线程的周期时间,线程按 参数3来间隔启动
         * 2如果 线程执行时间大于参数3 按 线程实际实际执行
         * 以固定的频率执行定时任务
         * 参数1：要执行的定时任务，这个定时任务实现了Runnable接口
         * 参数2：延迟多长时间执行
         * 参数3：定时任务执行的周期，此时的1000表示每次执行间隔1000毫秒
         * 参数4：参数2和参数3的单位
         * 注意：定时任务执行周期1000毫秒，每次执行定时任务耗时800毫秒，那么在执行过程中不会计算每次的耗时时间，还是以
         * 1000毫秒为周期
         */
        ses.scheduleWithFixedDelay(new Runnable() {
            @Override
            public void run() {
                LocalDateTime ldt = LocalDateTime.now();
                DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-LL-dd HH:mm:ss:SS");
                String dateTime = dtf.format(ldt);
                System.out.println(dateTime);
                // 模拟每次执行定时任务需要800毫秒
                try {
                    //Thread.sleep(800);
                    //2021-01-06 19:34:32
                    //2021-01-06 19:34:33
                    //2021-01-06 19:34:34
                    //2021-01-06 19:34:35
                    Thread.sleep(2000);
                    //2021-01-06 19:36:13:32
                    //2021-01-06 19:36:15:36
                    //2021-01-06 19:36:17:36
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },1000,1000, TimeUnit.MICROSECONDS);
    }
}
